#ifndef HEX_BIN_H
#define HEX_BIN_H

#include <QFile>
#include <QFileInfo>
#include <QString>
#include <QList>
#include <QDebug>
#include <QCryptographicHash>
#include <QByteArray>

#include "iostream"
#include "cardReaderDev.h"

namespace SDHuaYi_Script
{

#define DATA_LEN    1
#define DATA_ADD    3
#define DATA_TYPE   7
#define DATA_TEXT   9


class Hex_Bin
{
public:
    // 读卡器
        cardReaderDev iReader;

    /*
     * 参数：str 需要解析的文件路径
     *      mode 解密模式，默认使用SM4 cbc加密
     *          SM4_CBC     SM4 cbc加密
     *          TDES_CBC    TDES cbc加密
     *
     */
//    Hex_Bin(QString str,cardReaderDev &iReader,int mode = 1);
    Hex_Bin(QString str,cardReaderDev &iReader,QString addr = "0", int mode = 1);

    //读出的Hex文件按行存放的列表
    QList <QString> file_line;
    //解析出的数据存放的列表
    QList <QString> H_B_line;

    /*
     * 功能：判断文件属性
     * 返回值： 文件为iHex文件返回1
     *         文件为Bin文件返回2
     *         其他返回0
     */
    int isHex_or_Bin();

    /*
     * 功能：从iHex文件中读出数据并按行存放在列表file_line中
     * 返回值：成功true   失败false
     */
    bool Get_Hex();

    /*
     * 功能：从Bin文件中读出数据并存放在字符串file_all中
     * 返回值：成功true   失败false
     */
    bool Get_Bin();

    /*
     * 功能：判断一行Hex数据的校验是否正确
     * 返回值：成功true   失败false
     */
    bool Hex_verify(QString str);

    /*
     * 功能：判断列表file_line中所有Hex数据的校验是否正确
     * 返回值：成功true   失败false
     */
    bool Hex_verify_all();

    bool Get_Order();

    /*
     * 功能：将列表file_line中所有Hex数据转化为Bin文件数据
     */
    void hex_text();

    /*
     * 功能：去除列表中的空行
     */
    void move_Empty();

    bool Send_Cos();

    void Erasure_Falsh();

#if 0
    void Hex_type0();
    void Hex_type1();
    void Hex_type2();
    void Hex_type3();
    void Hex_type4();
    void Hex_type5();
    bool Hex_analysis();
#endif

    /*
     * 功能：将Bin文件数据转化为密文指令
     */
    bool Bin_analysis();

    /*
     * 功能：返回一行Hex数据中的数据长度
     * 参数：要解析的Hex数据行
     */
    QString get_len(QString str);

    /*
     * 功能：返回一行Hex数据中的数据地址
     * 参数：要解析的Hex数据行
     */
    QString get_addr(QString str);

    /*
     * 功能：返回一行Hex数据中的数据类型
     * 参数：要解析的Hex数据行
     */
    QString get_type(QString str);

    /*
     * 功能：返回一行Hex数据中的数据值
     * 参数：要解析的Hex数据行
     */
    QString get_data(QString str);

    /*
     * 功能：返回一行Hex数据中的数据校验值
     * 参数：要解析的Hex数据行
     */
    QString get_verify(QString str);

//    //加解密类的对象
//    JiaJiemi encrypt_sm4;

//    //设置加解密用到的密钥
//    void set_sm4_cbc(QString key,QString iv);

private:
    //需要读取的文件路径
    QString file;
    //Bin数据存放的空间
    QString file_all;
    //数据文件存放的起始地址
    int kais_addr;
    //加解密使用的模式选择
    int encrypt_mode;
};

}
#endif // HEX_BIN_H
